//
// Created by 吳廣帥 on 2023/8/2.
//
#include "hc595.h"
#include "cmsis_os2.h"


uint8_t dit1 = 0x9f; // 1段
uint8_t dit2 = 0x25; // 2段
uint8_t dit3 = 0x0d; // 3段
uint8_t dit4 = 0x9f; // 1段

/** 释放数据 */
void HC595_Out_Data(){
    HAL_GPIO_WritePin(HC595_RCLK_GPIO_PORT,HC595_RCLK_GPIO,0);
    HAL_GPIO_WritePin(HC595_RCLK_GPIO_PORT,HC595_RCLK_GPIO,1);
}
/** 写一位数据 */
void HC595_Write_Bit(int pin) {
    HAL_GPIO_WritePin(HC595_DIO_GPIO_PORT,HC595_DIO_GPIO,pin);
    HAL_GPIO_WritePin(HC595_SCLK_GPIO_Port,HC595_SCLK_GPIO,0);
    HAL_GPIO_WritePin(HC595_SCLK_GPIO_Port,HC595_SCLK_GPIO,1);
}
/** 写段码数据 */
void HC595_Write_Byte(uint8_t data){
    for(int i = 0; i < 8; i++) {
        int pin = data & 0x01 ? 1 : 0;
        HC595_Write_Bit(pin);
        data >>= 1;
    }
}
/** 写位码数据 */
void HC595_Write_Position_Byte(uint8_t data){
    for(int i = 0; i < 8; i++) {
        int pin = data & 0x80 ? 1 : 0;
        HC595_Write_Bit(pin);
        data <<= 1;
    }
}
/** 清除最后一位显示显示 */
void HC595_Clear(){
    HC595_Write_Byte(0x00); // 显示灯
    HC595_Write_Byte(0x00); // 选位置
    HC595_Out_Data();
}
/** 显示使用 16进制数据方式 */
void HC595_Display_Run() {
    HC595_Write_Byte(dit1); // 显示灯
    HC595_Write_Position_Byte(0x08); // 1位
    HC595_Out_Data();
    HC595_Write_Byte(dit2); // 显示灯
    HC595_Write_Position_Byte(0x04); // 2位
    HC595_Out_Data();
    HC595_Write_Byte(dit3); // 显示灯
    HC595_Write_Position_Byte(0x02); // 3位
    HC595_Out_Data();
    HC595_Write_Byte(dit4); // 显示灯
    HC595_Write_Position_Byte(0x01); // 4位
    HC595_Out_Data();
    HC595_Clear();
}
/** 16进制按位显示 */
void HC595_Display_Hex(uint8_t data1, uint8_t data2, uint8_t data3, uint8_t data4){
    dit1 = data1;
    dit2 = data2;
    dit3 = data3;
    dit4 = data4;
}
/** 初始化函数 */
void HC595_Init(){
    HAL_GPIO_WritePin(HC595_DIO_GPIO_PORT,HC595_DIO_GPIO,1);
    HAL_GPIO_WritePin(HC595_RCLK_GPIO_PORT,HC595_RCLK_GPIO,1);
    HAL_GPIO_WritePin(HC595_SCLK_GPIO_PORT,HC595_SCLK_GPIO,1);
}
/** 显示测试 */
void HC595_Display_Test(){
    for (int i = 0; i < 10; i++) {
        HC595_Display_Hex(LED_NUM[i],LED_NUM[i],LED_NUM[i],LED_NUM[i]);
        HC595_Display_Run();
        HAL_Delay(100);
    }
}

/** Err显示 */
void HC595_Display_Error(){
    HC595_Display_Hex(LED_CHAR[4],LED_CHAR[12],LED_CHAR[12],LED_CLOSE);
}